package com.cy.pj.sys.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cy.pj.common.bo.CheckBox;
import com.cy.pj.common.bo.PageObject;
import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.sys.dao.SysRoleDao;
import com.cy.pj.sys.dao.SysRoleMenuDao;
import com.cy.pj.sys.pojo.SysRole;
import com.cy.pj.sys.pojo.SysRoleMenu;
import com.cy.pj.sys.service.SysRoleService;

import io.micrometer.core.instrument.util.StringUtils;

@Service
public class SysRoleServiceImpl implements SysRoleService {
	@Autowired
	SysRoleDao sysRoleDao;
	@Autowired
	SysRoleMenuDao sysRoleMenuDao;
	
	@Override
	public PageObject<SysRole> findPageObjects(String name, Long pageCurrent) {
		//1.先进行参数校验
		if(pageCurrent!=null && pageCurrent<1) {
			throw new IllegalArgumentException("");
		}
		//2.统计总记录数
		long rowCount = sysRoleDao.getRowCount(name);
		if(rowCount==0) {
			throw new ServiceException("记录不存在!");
		}
		int pageSize = 2;
		long startIndex = (pageCurrent-1) * pageSize;
		List<SysRole> list = sysRoleDao.doFindPageObjects(name, startIndex, pageSize);
		return new PageObject<SysRole>(rowCount,pageCurrent, pageSize,list);
	}

	@Override
	public int saveObject(SysRole sysRole,Integer... ids) {
		if(sysRole==null){
			throw new IllegalArgumentException("保存对象不能为空");
		}
		if(StringUtils.isEmpty(sysRole.getName())) {
			throw new IllegalArgumentException("角色名不能为空");
		}
		if( ids==null || ids.length<1) {
			throw new IllegalArgumentException("需要为角色指定权限");
		}
		int rows = sysRoleDao.insertObject(sysRole);
		sysRoleMenuDao.insertObjects(sysRole.getId(), ids);
		return rows;
	}

	/** 修改角色数据 */
	@Override
	public int updateObject(SysRole sysRole,Integer... ids) {
		System.out.println("Service层updateObject方法执行了...");
		System.out.println(" sysRole:"+sysRole);
		System.out.println(" menuIds:"+ids);
		if(sysRole==null){
			throw new IllegalArgumentException("保存对象不能为空");
		}
		if(StringUtils.isEmpty(sysRole.getName())) {
			throw new IllegalArgumentException("角色名不能为空");
		}
		if( ids==null || ids.length<1) {
			throw new IllegalArgumentException("需要为角色指定权限");
		}
		
		int rows = sysRoleDao.updateObject(sysRole);
		if(rows==0) {
			throw new ServiceException("此角色可能已经不存在了");
		}
		System.out.println("调用SysRoleDao的updateObject方法修改角色..."+"修改的角色id为"+sysRole.getId());
		sysRoleMenuDao.deleteObjectByRoleId(sysRole.getId());
		System.out.println("调用SysRoleMenuDao的deleteObjectByRoleId方法删除依赖关系...");
		sysRoleMenuDao.insertObjects(sysRole.getId(), ids);
		System.out.println("调用SysRoleMenuDao的insertObjects方法注入新的依赖关系...");
		return rows;
	}
	
	@Override
	/** 基于id删除角色信息(先删关系数据) */
	public int deleteObjectById(Integer id) {
		//1.先进行参数的校验
		if(id==null || id<1) {
			throw new IllegalArgumentException("请先选择要删除的角色!");
		}
		//先删除关系数据
		sysRoleMenuDao.deleteObjectByRoleId(id);
		//在再删除角色信息
		int rows = sysRoleDao.deleteObjectById(id);
		if(rows==0) {
			throw new IllegalArgumentException("角色信息可能已经不存在!");
		}
		return rows;
	}
	
	
	/** 基于角色id查询角色以及角色对应的菜单id */
	//方案2:业务层发起一次查询,数据层SQL嵌套查询
	@Override
	public SysRoleMenu findById(Integer id) {
		SysRoleMenu rm = sysRoleDao.findById(id);
		if(rm==null) {
			throw new ServiceException("此角色可能已经不存在");
		}
		return rm;
	}

	@Override
	public List<CheckBox> doFindRoles() {
		return sysRoleDao.doFindRoles();
	}
	
//	方案1:查两张表(业务层发起多次单表查询,然后实现统一封装)
//	@Override
//	public SysRoleMenu findById(Integer id) {
//		SysRoleMenu rm = sysRoleDao.findById(id);
//		List<Integer> ids = sysRoleMenuDao.findMenuIdsByRoleId(id);
//		rm.setMenuIds(ids);
//		return rm;
//	}

}
